home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M05ADR.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  2KB  |  157 lines

  1. /* m05adr.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6805.h"
  16.  
  17. int
  18. addr(esp)
  19. register struct expr *esp;
  20. {
  21.     register c;
  22.     register struct area *espa;
  23.     register addr_t espv;
  24.     char *tcp;
  25.  
  26.     if ((c = getnb()) == '#') {
  27.         expr(esp, 0);
  28.         esp->e_mode = S_IMMED;
  29.     } else if (c == ',') {
  30.         if ((c = admode(ax)) != S_X)
  31.             aerr();
  32.         esp->e_mode = S_IX;
  33.         esp->e_flag = 0;
  34.         esp->e_addr = 0;
  35.         esp->e_base.e_ap = NULL;
  36.     } else if (c == '*') {
  37.         expr(esp, 0);
  38.         esp->e_mode = S_DIR;
  39.         if (esp->e_addr & ~0xFF)
  40.             err('d');
  41.         if (more()) {
  42.             comma();
  43.             tcp = ip;
  44.             if (admode(ax) == S_X) {
  45.                 esp->e_mode = S_I8X;
  46.             } else {
  47.                 ip = --tcp;
  48.             }
  49.         }
  50.     } else {
  51.         unget(c);
  52.         if ((esp->e_mode = admode(ax)) != 0) {
  53.             ;
  54.         } else {
  55.             expr(esp, 0);
  56.             espa = esp->e_base.e_ap;
  57.             espv = esp->e_addr;
  58.             if (more()) {
  59.                 comma();
  60.                 if (admode(ax) != S_X)
  61.                     aerr();
  62.                 if (esp->e_flag == 0 && espa == NULL && (espv & ~0xFF) == 0) {
  63.                     esp->e_mode = S_I8X;
  64.                 } else {
  65.                     esp->e_mode = S_INDX;
  66.                 }
  67.             } else {
  68.                 esp->e_mode = S_EXT;
  69.             }
  70.         }
  71.     }
  72.     return (esp->e_mode);
  73. }
  74.     
  75. /*
  76.  * Enter admode() to search a specific addressing mode table
  77.  * for a match. Return the addressing value on a match or
  78.  * zero for no match.
  79.  */
  80. int
  81. admode(sp)
  82. register struct adsym *sp;
  83. {
  84.     register char *ptr;
  85.     register int i;
  86.     unget(getnb());
  87.     i = 0;
  88.     while ( *(ptr = (char *) &sp[i]) ) {
  89.         if (srch(ptr)) {
  90.             return(sp[i].a_val);
  91.         }
  92.         i++;
  93.     }
  94.     return(0);
  95. }
  96.  
  97. /*
  98.  *      srch --- does string match ?
  99.  */
  100. int
  101. srch(str)
  102. register char *str;
  103. {
  104.     register char *ptr;
  105.     ptr = ip;
  106.  
  107. #if    CASE_SENSITIVE
  108.     while (*ptr && *str) {
  109.         if(*ptr != *str)
  110.             break;
  111.         ptr++;
  112.         str++;
  113.     }
  114.     if (*ptr == *str) {
  115.         ip = ptr;
  116.         return(1);
  117.     }
  118. #else
  119.     while (*ptr && *str) {
  120.         if(ccase[*ptr] != ccase[*str])
  121.             break;
  122.         ptr++;
  123.         str++;
  124.     }
  125.     if (ccase[*ptr] == ccase[*str]) {
  126.         ip = ptr;
  127.         return(1);
  128.     }
  129. #endif
  130.  
  131.     if (!*str)
  132.         if (any(*ptr," \t\n,];")) {
  133.             ip = ptr;
  134.             return(1);
  135.         }
  136.     return(0);
  137. }
  138.  
  139. /*
  140.  *      any --- does str contain c?
  141.  */
  142. int
  143. any(c,str)
  144. char    c, *str;
  145. {
  146.     while (*str)
  147.         if(*str++ == c)
  148.             return(1);
  149.     return(0);
  150. }
  151.  
  152. struct adsym    ax[] = {    /* a or x registers */
  153.     "a",    S_A,
  154.     "x",    S_X,
  155.     "",    0x00
  156. };
  157.